Source: Low-Income Energy Affordability Data, 2018 Update
glimpse(lead)
## Rows: 50
## Columns: 37
## $ FIP <dbl> 51003010100, 51003010201, 51003010202, 510030…
## $ county <chr> "Albemarle", "Albemarle", "Albemarle", "Albem…
## $ tract <dbl> 101.00, 102.01, 102.02, 103.00, 104.01, 104.0…
## $ totalinc <dbl> 258861238.7, 183602936.6, 192243103.3, 329144…
## $ totalelep <dbl> 4257203.1, 3461893.8, 2766898.1, 5307149.1, 4…
## $ totalgas <dbl> 1048712.27, 587780.45, 698082.82, 895763.99, …
## $ totalother <dbl> 5.733480e+05, 1.800686e+05, 2.793150e+05, 1.2…
## $ averageburden <dbl> 2.271203, 2.303745, 1.947688, 1.923259, 2.919…
## $ avg_hh_exp <dbl> 2393.537, 2451.253, 2585.068, 1715.611, 2999.…
## $ lowburden <dbl> 1750.933158, 1504.638587, 1008.541509, 2810.7…
## $ highburden <dbl> 190.17722, 133.26387, 76.66867, 147.13759, 29…
## $ veryhighburden <dbl> 115.88093, 71.29768, 41.89234, 115.82400, 114…
## $ extremelyhighburden <dbl> 55.616929, 25.143459, 71.777109, 110.487515, …
## $ totalunits <dbl> 2112.60824, 1734.34359, 1198.87963, 3184.1515…
## $ numberburdened <dbl> 361.67508, 229.70501, 190.33812, 373.44911, 4…
## $ percentburdened <dbl> 17.119837, 13.244492, 15.876333, 11.728371, 2…
## $ total_0_30 <dbl> 155.60536, 95.61704, 99.49979, 246.48409, 106…
## $ total_30_60 <dbl> 276.2379, 177.3530, 81.6247, 395.1852, 288.12…
## $ total_60_80 <dbl> 202.76487, 248.88764, 57.15861, 424.89037, 19…
## $ total_80_100 <dbl> 207.11334, 233.06722, 77.81864, 352.95913, 15…
## $ total_over_100 <dbl> 1270.886801, 979.418685, 882.777886, 1764.632…
## $ burdened_0_30 <dbl> 128.62143, 93.05765, 94.56048, 237.15181, 104…
## $ burdened_30_60 <dbl> 183.41409, 104.48448, 77.91363, 132.27262, 27…
## $ burdened_60_80 <dbl> 31.7477293, 18.8320286, 5.3202464, 3.7823126,…
## $ burdened_80_100 <dbl> 17.89061934, 6.85006999, 12.54376158, 0.24236…
## $ burdened_over_100 <dbl> 0.001213645, 6.480778923, 0.000000000, 0.0000…
## $ percent_0_30 <dbl> 82.65874, 97.32330, 95.03586, 96.21384, 98.49…
## $ percent_30_60 <dbl> 66.39716, 58.91328, 95.45349, 33.47104, 95.15…
## $ percent_60_80 <dbl> 15.6574113, 7.5664781, 9.3078657, 0.8901855, …
## $ percent_80_100 <dbl> 8.63808158, 2.93909629, 16.11922526, 0.068665…
## $ percent_over_100 <dbl> 9.549591e-05, 6.616965e-01, 0.000000e+00, 0.0…
## $ total_owners <dbl> 1717.57391, 1530.84877, 1121.92886, 2112.4528…
## $ total_renters <dbl> 398.26352, 204.56073, 78.02610, 1090.28822, 3…
## $ burdened_owners <dbl> 259.6989959, 204.2634172, 160.9956155, 164.01…
## $ burdened_renters <dbl> 101.97609, 25.44159, 29.34250, 209.43103, 169…
## $ percent_burdened_owners <dbl> 15.1201060, 13.3431480, 14.3498952, 7.7643427…
## $ percent_burdened_renters <dbl> 25.605179, 12.437181, 37.606009, 19.208777, 4…
Observations are census tract estimates of:
totalinc)totalelep, totalgas, totalother)averageburden)
avg_hh_exp)lowburden)highburden)veryhighburden)extremelyhighburden)totalunits)numberburdened)
percentburdened)total_0_30)total_30_60)total_60_80)total_80_100)total_over_100)burdened_0_30, burdened_30_60, burdened_60_80, burdened_80_100, burdened_over_100)percent_0_30, percent_30_60, percent_60_80, percent_80_100, percent_over_100)total_owners)total_renters)burdened_owners)burdened_renters)percent_burdened_owners)percent_burdened_renters)Summary of all non-missing variables:
lead %>% select(-c(FIP:tract)) %>%
select(where(~is.numeric(.x) && !is.na(.x))) %>%
as.data.frame() %>%
stargazer(., type = "text", title = "Summary Statistics", digits = 0,
summary.stat = c("mean", "sd", "min", "median", "max"))
##
## Summary Statistics
## ===============================================================================
## Statistic Mean St. Dev. Min Median Max
## -------------------------------------------------------------------------------
## totalinc 177,919,174 90,029,492 662,819 173,393,476 405,427,996
## totalelep 3,736,593 2,046,840 130,692 3,420,559 8,786,365
## totalgas 836,745 520,782 0 781,223 2,471,311
## totalother 184,122 142,104 0 171,001 573,348
## averageburden 3 3 2 3 20
## avg_hh_exp 2,379 590 1,623 2,281 4,011
## lowburden 1,369 669 1 1,212 3,208
## highburden 221 147 0 187 650
## veryhighburden 142 95 0 126 443
## extremelyhighburden 112 99 3 85 464
## totalunits 1,844 789 85 1,752 3,975
## numberburdened 475 274 62 421 1,223
## percentburdened 28 16 6 25 98
## total_0_30 228 131 39 225 666
## total_30_60 294 138 0 277 585
## total_60_80 199 107 0 191 488
## total_80_100 187 105 0 183 535
## total_over_100 936 489 1 888 2,195
## burdened_0_30 217 128 38 216 647
## burdened_30_60 187 133 0 137 548
## burdened_60_80 48 61 0 27 287
## burdened_80_100 21 35 0 11 185
## burdened_over_100 1 3 0 0 12
## percent_0_30 95 5 81 96 100
## percent_30_60 62 28 19 64 98
## percent_60_80 24 25 0 13 89
## percent_80_100 10 13 0 7 62
## percent_over_100 0 0 0 0 1
## total_owners 1,248 770 17 1,186 3,459
## total_renters 624 401 68 555 1,667
## burdened_owners 273 231 0 193 892
## burdened_renters 202 143 21 190 681
## percent_burdened_owners 21 16 0 18 100
## percent_burdened_renters 37 20 7 35 98
## -------------------------------------------------------------------------------
Visual distributions of the data, shown with histograms and scatterplots
lead %>% select(FIP, averageburden) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram() +
facet_wrap(~measure, scales = "free")
lead %>% select(FIP, percentburdened) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram(binwidth=2) +
facet_wrap(~measure, scales = "free")
lead %>%
ggplot() +
geom_point(aes(x=extremelyhighburden, y=percentburdened))
lead %>%
ggplot() +
geom_point(aes(x=lowburden, y=percentburdened))
lead %>% select(FIP, percent_0_30:percent_over_100) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram() +
facet_wrap(~measure, scales = "free")
lead %>% select(FIP, percent_burdened_owners, percent_burdened_renters) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram(binwidth = 5) +
facet_wrap(~measure, scales = "free")
Maps to show the distribution of variables across spatial units
pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$averageburden)
leaflet(cvlshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = cvlshapes,
fillColor = ~pal(averageburden),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
"Avg. Burden: ", round(cvlshapes$averageburden, 2))) %>%
addLegend("bottomright", pal = pal, values = cvlshapes$averageburden,
title = "Average Energy Burden", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$avg_hh_exp)
leaflet(cvlshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = cvlshapes,
fillColor = ~pal(avg_hh_exp),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
"Avg. Household Energy Expenditures: ", round(cvlshapes$avg_hh_exp, 2))) %>%
addLegend("bottomright", pal = pal, values = cvlshapes$avg_hh_exp,
title = "Average Yearly Household Energy Expenditures", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$numberburdened)
leaflet(cvlshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = cvlshapes,
fillColor = ~pal(numberburdened),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
"Number Burdened: ", round(cvlshapes$numberburdened, 2))) %>%
addLegend("bottomright", pal = pal, values = cvlshapes$numberburdened,
title = "Number of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$percentburdened)
leaflet(cvlshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = cvlshapes,
fillColor = ~pal(percentburdened),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
"Pct. Burdened: ", round(cvlshapes$percentburdened, 2), "<br>",
"Pct. Burdened - 0-30% AMI: ", round(cvlshapes$percent_0_30, 2), "<br>",
"Pct. Burdened - 30-60% AMI: ", round(cvlshapes$percent_30_60, 2), "<br>",
"Pct. Burdened - 60-80% AMI: ", round(cvlshapes$percent_60_80, 2), "<br>",
"Pct. Burdened - 80-100% AMI: ", round(cvlshapes$percent_80_100, 2), "<br>",
"Pct. Burdened - 100%+ AMI: ", round(cvlshapes$percent_over_100, 2))) %>%
addLegend("bottomright", pal = pal, values = cvlshapes$percentburdened,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$percent_burdened_renters)
leaflet(cvlshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = cvlshapes,
fillColor = ~pal(percent_burdened_renters),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
"Pct. of Renters Burdened: ", round(cvlshapes$percent_burdened_renters, 2))) %>%
addLegend("bottomright", pal = pal, values = cvlshapes$percent_burdened_renters,
title = "Percent of Energy Burdened Rented Households", opacity = 0.7)
pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$percent_burdened_owners)
leaflet(cvlshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = cvlshapes,
fillColor = ~pal(percent_burdened_owners),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
"Pct. of Owners Burdened: ", round(cvlshapes$percent_burdened_owners, 2))) %>%
addLegend("bottomright", pal = pal, values = cvlshapes$percent_burdened_owners,
title = "Percent of Energy Burdened Owned Households", opacity = 0.7)
Several census tracts in Charlottesville and Albemarle County are primarily composed of UVA students, which makes energy burden difficult to calculate for these areas. Students typically spend a large portion of their “income” on energy, because they typically do not make a lot of money and get most of their money from other sources.
Census tracts 109.01, 109.02, and 109.03 in Albemarle County encompass the university. Charlottesville census tracts 2.01, 2.02, and 6, while not officially university property, house primarily students.
These student-dominated census tracts look like outliers on many of the variables of interest - tract 109.03 especially stands out - but they do not capture the whole picture.